package com.davidlife.javase.datatype;

import java.util.Objects;

public class CharDataType {

	public static void main(String[] args) {

		//char类型的值可以表示为十六进制，用转义序列“\\u”表示
		System.out.println("字符 A 十六进制：" + Integer.toHexString('A') + ", 十进制：" + Integer.valueOf('A'));
		System.out.println('\u0041');
		
		//Unicode转义序列(\\u)还可以出现在代码中，而其他的转义序列(\\b, \\n 等)不行,Unicode转移序列会在解析代码之前得到处理（即应该是编译前吧）。
		System.out.println\u0028"C"\u0029;  // \u0028 \u0029 分别表示( )
		\u0053\u0079\u0073\u0074\u0065\u006d\u002e\u006f\u0075\u0074\u002e\u0070\u0072\u0069\u006e\u0074\u006c\u006e\u0028\u0022\u0042\u0022\u0029;
	}

	/**
	 * 将字符串转成unicode
	 * @param str 待转字符串
	 * @return Unicode字符串
	 */
	public static String encodeUnicode(String str) {
		str = Objects.toString(str, "");
		StringBuilder sb = new StringBuilder();
		char c;
		int j;
		String tmp;
		char[] str_char = str.toCharArray();
		for(int i=0; i<str_char.length; i++) {
			c = str_char[i];
			sb.append("\\u");
			j = c >>> 8;  //取出高8位、
			tmp = Integer.toHexString(j);
			if(tmp.length() == 1) 
				sb.append(0);
			sb.append(tmp);
			j = c & 0xFF;  //取出低8位
			tmp = Integer.toHexString(j);
			if(tmp.length() == 1) 
				sb.append("0");
			sb.append(tmp);
		}
		return sb.toString();
	}
	
	/**
	 * 将Unicode字符串解码成普通字符串
	 * @param str Unicode字符串
	 * @return 普通字符串
	 */
	public static String decodeUnicode(String str) {
		str = Objects.toString(str, "");
		if(str.indexOf("\\u") == -1)  //如果不是unicode码则原样返回
			return str;
		StringBuilder sb = new StringBuilder();
		String[] hex = str.split("\\\\u");
		for (int i = 1; i < hex.length; i++) {
			int data = Integer.parseInt(hex[i], 16);
			sb.append((char)data);
		}
		return sb.toString();
	}

}
